package com.zyp.common.message.common.utils;



import com.zyp.common.message.common.Exception.CacheException;
import com.zyp.common.message.common.cache.IKeyBuilder;
import com.zyp.common.message.common.cache.KeyValuePair;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 缓存工具类
 */
public interface ICacheUtil {

    /**
     * 将键值对信息保存到缓存中(采用覆盖原则)
     *
     * @param key    键
     * @param value  值
     * @param expire 过期秒数，必须大于0
     * @return 保存是否成功
     */
    void set(IKeyBuilder key, Serializable value, int expire) throws CacheException;

    /**
     * 将键值对信息保存到缓存中(采用覆盖原则)
     *
     * @param key    键
     * @param value  值
     * @param expire 过期秒数，必须大于0
     * @return 保存是否成功
     */
    Boolean setnx(IKeyBuilder key, Serializable value, int expire) throws CacheException;

    /**
     * @param key
     * @param value
     * @return
     * @author dongdong.zhang
     * @date 2015年7月20日 下午11:35:24
     */
    void set(IKeyBuilder key, Serializable value) throws CacheException;

    /**
     * 批量写入信息
     *
     * @param datas
     * @return
     */
    List<Object> batchSet(List<KeyValuePair<IKeyBuilder, Serializable>> datas, int expire) throws CacheException;

    /**
     *  批量写入信息
     * @param datas
     * @return
     * @throws CacheException
     */
    List<Object> batchSet(List<KeyValuePair<IKeyBuilder, Serializable>> datas) throws CacheException;

    /**
     * 通过key从缓存中获取信息
     *
     * @param key   键
     * @param clazz 对象类型
     * @return 缓存对象信息
     */
    <T> T get(IKeyBuilder key, Class<T> clazz) throws CacheException;

    /**
     * 通过key从缓存中获取字符串信息
     *
     * @param key 键
     * @return 缓存字符串信息
     */
    String getString(IKeyBuilder key) throws CacheException;

    /**
     * 通过key从缓存中获取信息
     *
     * @param key   键
     * @param clazz 对象类型
     * @return 缓存对象列表信息
     */
    <T> List<T> getList(IKeyBuilder key, Class<T> clazz) throws CacheException;

    /**
     * 判断key在缓存中是否存在
     *
     * @param key
     * @return
     */
    boolean exists(IKeyBuilder key) throws CacheException;

    /**
     * 保存map集合
     *
     * @param values
     * @param expire ，必须大于0
     * @return
     */
    List<Object> mset(Map<IKeyBuilder, Serializable> values, int expire) throws CacheException;

    /**
     * @param values
     * @return
     */
    List<Object> mset(Map<IKeyBuilder, Serializable> values) throws CacheException;

    /**
     * 删除缓存中的key
     *
     * @param keys
     * @return
     */
    List<Object> del(IKeyBuilder... keys) throws CacheException;

    /**
     * 消息订阅
     *
     * @param key
     * @param timeUnit
     * @throws CacheException
     */
    Long getExpireTimeByKey(IKeyBuilder key, TimeUnit timeUnit) throws CacheException;

    /**
     * 获取分布式锁
     * 通过redis.setNx + expire实现分布式锁
     *
     * @param key
     * @param value
     * @return
     * @throws CacheException
     */
    Boolean getDisLock(IKeyBuilder key, Serializable value) throws CacheException;

    /**
     * 过期时间
     * 通过redis.setNx + expire实现分布式锁
     *
     * @param key
     * @param value
     * @return
     * @throws CacheException
     */
    Boolean expire(IKeyBuilder key, Long value) throws CacheException;

    /**
     * 原子加
     *
     * @param key
     * @param value
     * @return
     * @throws CacheException
     */
    Long incrBy(IKeyBuilder key, Long value) throws CacheException;

    /**
     * 原子减
     *
     * @param key
     * @param value
     * @return
     * @throws CacheException
     */
    Long decrBy(IKeyBuilder key, Long value) throws CacheException;
}
